<?php

namespace app\store\controller;

use app\store\model\User as UserModel;
use app\store\model\UserJiuzhen as UserJiuzhenModel;
use app\store\model\user\Grade as GradeModel;
use app\store\service\order\Export as Exportservice;
/**
 * 用户管理
 * Class User
 * @package app\store\controller
 */
class User extends Controller
{
    /**
     * undocumented function summary
     *
     * Undocumented function long description
     *
     * @param Type $var Description
     * @return type
     * @throws conditon
     **/
    public function export()
    {
        $list = $this->huanzhe1();
        // 导出csv文件
        // dump($list);die;
        return (new Exportservice)->huanzheList($list);
    }
    /**
     * 用户列表
     * @param string $key 手机号或者姓名
     * @param int $start_time 开始时间
     * @param int $end_time 结束时间
     * @return mixed
     * @throws \think\exception\DbException
     */
    public function index($key = '', $start_time = null, $end_time = null)
    {
        $model = new UserModel;
        $list = $model->getList($key, $start_time, $end_time);
        // dump($list );die;
        // 会员等级列表
        $gradeList = GradeModel::getUsableList();
        return $this->fetch('index', compact('list', 'gradeList'));
    }
    /**
     * 成为分销商
     * Undocumented function long description
     *
     * @param Type $var Description
     * @return type
     * @throws conditon
     **/
    public function fx()
    {
        $input = input();
        // 先判断是否已经是分销商
        $fx = DB("dealer_user")->where("user_id",$input['user_id'])->find();
        if (!$fx) {
            $data['user_id'] = $input['user_id'];
            $data['create_time'] = time();
            $data['wxapp_id'] = 10001;
            DB("dealer_user")->insert($data);
            return $this->renderSuccess('添加成功');
        }else if($fx['is_delete'] == 1){
            DB("dealer_user")->where("user_id",$input['user_id'])->update(['is_delete'=>'0']);
            return $this->renderSuccess('恢复成功');
        }else{
            return $this->renderSuccess('已近是代理商了');
        }
    }
    /**
     * 患者管理
     *
     * Undocumented function long description
     *
     * @param Type $var Description
     * @return type
     * @throws conditon
     **/
    public function huanzhe($key = '', $recommender = '', $start_date = '', $end_date = '')
    {
        // 初始化主表别名
        $query = DB('user_jiuzhen')->alias('uj')
            ->where('uj.is_del', '=', 0)
            ->join('dealer_referee dr', 'uj.user_id = dr.user_id', 'LEFT')
            ->join('dealer_user du', 'dr.dealer_id = du.user_id', 'LEFT')
            ->join('user u', 'dr.dealer_id = u.user_id', 'LEFT')
            ->join('user_jiuzhen ujr', 'dr.dealer_id = ujr.user_id AND ujr.is_del = 0', 'LEFT');
        // dump($key);die;
        // 搜索“平台”（即无推荐人）
        if ($key === '平台') {
            $query->where(function ($subQuery) {
                $subQuery->whereNull('dr.dealer_id')
                        ->whereOr('dr.dealer_id', '=', 0);
            });
        } elseif (!empty($key)) {
            // 搜索患者姓名、手机号、推荐人姓名、推荐人昵称
            $query->where(function ($subQuery) use ($key) {
                $subQuery->whereLike('uj.name', "%$key%")
                    ->whereOr('uj.phone', 'like', "%$key%")
                    ->whereOr('ujr.name', 'like', "%$key%")
                    ->whereOr('u.nickName', 'like', "%$key%");
            });
        }

        // 推荐人搜索（昵称或真实姓名）
        if (!empty($recommender)) {
            $query->where(function ($subQuery) use ($recommender) {
                $subQuery->whereLike('ujr.name', "%$recommender%")
                    ->whereOr('u.nickName', 'like', "%$recommender%");
            });
        }

        // 日期范围筛选
        if (!empty($start_date)) {
            $query->where('uj.create_time', '>=', strtotime($start_date . ' 00:00:00'));
        }
        if (!empty($end_date)) {
            $query->where('uj.create_time', '<=', strtotime($end_date . ' 23:59:59'));
        }

        // 查询并分页
        $list = $query->field([
                'uj.*',
                'ujr.name as recommender_name',
                'u.nickName as recommender_nickname'
            ])
            ->group('uj.user_id')
            ->order(['uj.create_time' => 'desc'])
            ->paginate(15, false, [
                'query' => request()->request()
            ]);
        return $this->fetch('huanzhe', compact('list'));
    } 
    public function huanzhe1($key = '', $recommender = '', $start_date = '', $end_date = '')
    {
        // 初始化主表别名
        $query = DB('user_jiuzhen')->alias('uj')
            ->where('uj.is_del', '=', 0)
            ->join('dealer_referee dr', 'uj.user_id = dr.user_id', 'LEFT')
            ->join('dealer_user du', 'dr.dealer_id = du.user_id', 'LEFT')
            ->join('user u', 'dr.dealer_id = u.user_id', 'LEFT')
            ->join('user_jiuzhen ujr', 'dr.dealer_id = ujr.user_id AND ujr.is_del = 0', 'LEFT');
        // dump($key);die;
        // 搜索“平台”（即无推荐人）
        if ($key === '平台') {
            $query->where(function ($subQuery) {
                $subQuery->whereNull('dr.dealer_id')
                        ->whereOr('dr.dealer_id', '=', 0);
            });
        } elseif (!empty($key)) {
            // 搜索患者姓名、手机号、推荐人姓名、推荐人昵称
            $query->where(function ($subQuery) use ($key) {
                $subQuery->whereLike('uj.name', "%$key%")
                    ->whereOr('uj.phone', 'like', "%$key%")
                    ->whereOr('ujr.name', 'like', "%$key%")
                    ->whereOr('u.nickName', 'like', "%$key%");
            });
        }

        // 推荐人搜索（昵称或真实姓名）
        if (!empty($recommender)) {
            $query->where(function ($subQuery) use ($recommender) {
                $subQuery->whereLike('ujr.name', "%$recommender%")
                    ->whereOr('u.nickName', 'like', "%$recommender%");
            });
        }

        // 日期范围筛选
        if (!empty($start_date)) {
            $query->where('uj.create_time', '>=', strtotime($start_date . ' 00:00:00'));
        }
        if (!empty($end_date)) {
            $query->where('uj.create_time', '<=', strtotime($end_date . ' 23:59:59'));
        }

        // 查询并分页
        $list = $query->field([
                'uj.*',
                'ujr.name as recommender_name',
                'u.nickName as recommender_nickname'
            ])
            ->group('uj.user_id')
            ->order(['uj.create_time' => 'desc'])
            ->paginate(100000000000, false, [
                'query' => request()->request()
            ]);
        return $list->toArray()['data'];
    } 
/**
     * undocumented function summary
     *
     * Undocumented function long description
     *
     * @param Type $var Description
     * @return type
     * @throws conditon
     **/
    public function huanzhedelete($jiuzhen_id)
    {
        // dump($jiuzhen_id);die;
        if (DB('user_jiuzhen')->where('jiuzhen_id', '=', $jiuzhen_id)->update(['is_del'=>'1'])) {
            return $this->renderSuccess('删除成功');
        }
        return $this->renderError('删除失败');
    }
    /**
     * 删除用户
     * @param $user_id
     * @return array
     * @throws \think\exception\DbException
     */
    public function delete($user_id)
    {
        // 用户详情
        $model = UserModel::detail($user_id);
        if ($model->setDelete()) {
            return $this->renderSuccess('删除成功');
        }
        return $this->renderError($model->getError() ?: '删除失败');
    }

    /**
     * 用户充值
     * @param $user_id
     * @param int $source 充值类型
     * @return array|bool
     * @throws \think\Exception
     * @throws \think\exception\DbException
     */
    public function recharge($user_id, $source)
    {
        // 用户详情
        $model = UserModel::detail($user_id);
        if ($model->recharge($this->store['user']['user_name'], $source, $this->postData('recharge'))) {
            return $this->renderSuccess('操作成功');
        }
        return $this->renderError($model->getError() ?: '操作失败');
    }

    /**
     * 修改会员等级
     * @param $user_id
     * @return array|bool
     * @throws \think\Exception
     * @throws \think\exception\DbException
     */
    public function grade($user_id)
    {
        // 用户详情
        $model = UserModel::detail($user_id);
        if ($model->updateGrade($this->postData('grade'))) {
            return $this->renderSuccess('操作成功');
        }
        return $this->renderError($model->getError() ?: '操作失败');
    }
    public function track($search = '', $start_time = '', $end_time = '')
    {
        $scene = input('get.scene', '', 'trim');         // 新增：场景值筛选
        $sceneMap = $this->wxSceneMap();                 // 场景值 => 文本

        $model = new \app\common\model\UserBehaviorLog;

        $query = $model->alias('b')
            // 行为所属用户
            ->join('user u', 'u.user_id = b.user_id', 'LEFT')
            ->join('user_jiuzhen uj', 'uj.user_id = b.user_id', 'LEFT')

            // 推荐人（来自分销表）
            ->join('dealer_user du', 'du.user_id = b.user_id', 'LEFT')
            ->join('user ru', 'ru.user_id = du.referee_id', 'LEFT')
            ->join('user_jiuzhen rj', 'rj.user_id = du.referee_id', 'LEFT')

            ->field([
                'b.*',
                'u.nickName'          => 'nickName',
                'b.fromroute'         => 'fromroute',
                'b.route'             => 'route',

                // 就诊人（当前用户）
                'uj.name'             => 'patient_name',
                'uj.phone'            => 'patient_phone',

                // 推荐人
                'du.referee_id'       => 'referee_id',
                'ru.nickName'         => 'referee_nick',
                'rj.name'             => 'referee_name',
                'rj.phone'            => 'referee_phone',
            ]);

        // 关键词
        if ($search !== '') {
            $query->where(function($q) use ($search) {
                $like = '%' . $search . '%';

                // 先匹配人名/电话/昵称/URL/路由
                $q->where('uj.name', 'like', $like)           // 就诊人姓名
                ->whereOr('uj.phone', 'like', $like)        // 就诊人电话
                ->whereOr('u.nickName', 'like', $like)      // 用户昵称
                ->whereOr('rj.name', 'like', $like)         // 推荐人姓名
                ->whereOr('rj.phone', 'like', $like)        // 推荐人电话
                ->whereOr('ru.nickName', 'like', $like)     // 推荐人昵称
                ->whereOr('b.url', 'like', $like)           // 页面URL
                ->whereOr('b.fromroute', 'like', $like)     // 起始路由
                ->whereOr('b.route', 'like', $like);        // 落地路由

                // 如果关键词是纯数字，再额外匹配 action / 推荐人ID
                if (ctype_digit($search)) {
                    $q->whereOr('b.action', (int)$search)
                    ->whereOr('du.referee_id', (int)$search);
                }
            });
        }

        // 场景值筛选
        if ($scene !== '') {
            $query->where('b.action', (int)$scene);
        }

        // 时间区间（你的 create_time 是 'Y-m-d H:i:s' 字符串）
        if ($start_time !== '' && $end_time !== '') {
            $query->whereBetween('b.create_time', [
                $start_time . ' 00:00:00',
                $end_time   . ' 23:59:59'
            ]);
        }

        $list = $query->order('b.create_time desc')
            ->paginate(15, false, [
                'query' => request()->request()  // 保留所有查询参数，分页正确
            ]);

        // 给每条记录补上场景中文
        foreach ($list as &$row) {
            $code = (int)$row['action'];
            $row['scene_text'] = $sceneMap[$code] ?? ('未知场景('.$code.')');
        }

        return $this->fetch('track', [
            'list'      => $list,
            'sceneMap'  => $sceneMap,       // 传给前端生成下拉
        ]);
    }

    /**
     * 微信小程序 场景值映射（尽可能全）
     * 参考微信官方文档，保留常见与较新的场景码；缺失时会显示“未知场景(编号)”
     */
    private function wxSceneMap(): array
    {
        return [
            1001 => '发现栏小程序主入口（最近使用）',
            1005 => '顶部搜索框-搜索结果页',
            1006 => '发现栏小程序主入口-搜索框-搜索结果页',
            1007 => '单人聊天-小程序消息卡片',
            1008 => '群聊-小程序消息卡片',
            1011 => '扫描二维码',
            1012 => '长按图片识别二维码',
            1013 => '相册选取二维码',
            1014 => '小程序模版消息/订阅消息',
            1017 => '体验版入口页',
            1019 => '微信钱包',
            1020 => '公众号Profile页-相关小程序',
            1022 => '聊天顶部置顶-小程序入口',
            1023 => '安卓系统桌面图标',
            1024 => '小程序Profile页',
            1025 => '扫描一维码',
            1026 => '附近的小程序列表',
            1027 => '搜索结果页-使用过的小程序列表',
            1028 => '我的卡包',
            1029 => '卡券详情页',
            1030 => '自动化测试打开小程序',
            1031 => '长按图片识别一维码',
            1032 => '相册选取一维码',
            1034 => '微信支付完成页',
            1035 => '公众号自定义菜单',
            1036 => 'App分享消息卡片',
            1037 => '小程序打开小程序',
            1038 => '从另一个小程序返回',
            1039 => '摇电视',
            1042 => '添加好友搜索-结果页',
            1043 => '公众号模板消息（旧）',
            1044 => '带shareTicket的小程序消息卡片',
            1045 => '朋友圈广告',
            1046 => '朋友圈广告详情页',
            1047 => '扫描小程序码',
            1048 => '长按图片识别小程序码',
            1049 => '相册选取小程序码',
            1052 => '卡券适用门店列表',
            1053 => '搜一搜结果页',
            1054 => '顶部搜索框-小程序快捷入口',
            1056 => '音乐播放器菜单',
            1057 => '钱包-银行卡详情页',
            1058 => '公众号文章内',
            1059 => '体验版绑定邀请页',
            1060 => '微信支付-商家小程序版',
            1061 => '相册（iOS13+可能合并行为）',
            1064 => '连Wi-Fi成功页',
            1065 => '微信游戏中心',
            1066 => '微信游戏详情页',
            1067 => '扫一扫-商品条码结果页',
            1068 => '视频号主页（资料页）',
            1069 => '视频号直播页',
            1071 => '相册选视频',
            1072 => '来源小程序Profile页',
            1073 => '视频号主页-商品橱窗',
            1074 => '微信客服会话',
            1077 => '群工具',
            1078 => '连Wi-Fi成功页跳转商家主页',
            1079 => '小程序搜索结果列表',
            1081 => '公众号文章-商品卡片',
            1082 => '城市服务入口',
            1084 => '收藏夹',
            1089 => '任务中心',
            1090 => '视频号直播-小程序挂载',
            1091 => '公众号文章-视频号挂载',
            1092 => '视频号直播间挂载商品',
            1095 => '公众号视频/视频号短视频',
            1096 => '聊天素材-图片/视频/文件等',
            1097 => '订阅消息-服务通知',
            1099 => '服务号-消息卡片',
            1102 => '对话栏-小程序图标',
            1103 => '长按识别商家码',
            1104 => '相册选取商家码',
            1106 => '扫一扫-识别商家码',
            1107 => '扫一扫-识别小店码/视频号小店',
            1113 => '视频号付费直播间',
            1114 => '朋友圈-小程序广告组件',
            1119 => '朋友圈-文字链落地页',
            1120 => '朋友圈-图片广告落地页',
            1121 => '朋友圈-视频广告落地页',
            1124 => '扫一扫-AR（识物）',
            1125 => '扫一扫-二维码（相机内）',
            1126 => '扫一扫-条码（相机内）',
            1129 => '扫一扫-翻译',
            1131 => '相册选取小程序码（新版）',
            1133 => '微信豆商城/视频号商品',
            1135 => '搜索-品牌专区',
            1146 => '微信输入法-发现栏',
            1148 => '公众号-服务菜单跳转',
            1150 => '扫一扫-文档扫描',
            1151 => '扫一扫-笔记扫描',
            1152 => '扫一扫-相册文字识别',
            1153 => '扫一扫-封面识别',
            1154 => '扫一扫-翻译（新版）',
            1155 => '扫一扫-学习强国/第三方入口',
            1157 => '聊天文件页',
            1158 => '视频号-店铺橱窗商品',
            1160 => '视频号-直播预约页',
            1167 => '微信支付收银台唤起',
            1168 => '小程序-任务栏',
            1169 => '视频号-直播间挂件',
            1171 => '微信相册-精选',
            1173 => '视频号-直播回放页',
            1175 => '订阅号消息-服务提醒',
            1176 => '扫描地铁码/出行码',
            1177 => '健康码/防疫码',
            1178 => '微信文章“看一看”',
            1181 => '发现栏-视频',
            1183 => '购物单（微信购物）',
            1184 => '微信–扫一扫–小程序码（新）',
            1185 => '微信–发现–搜一搜（新）',
            1186 => '微信–我的–支付（新）',
            1187 => '微信–发现–附近（新）',
            1189 => '微信–服务–城市服务（新）',
            1191 => '微信豆购买页',
            1192 => '视频号-带货橱窗（新）',
            1194 => '视频号-直播预约Card',
            1195 => '微信副屏/车载',
            1196 => '企业微信-消息卡片',
            1197 => '企业微信-工作台',
            1199 => '企业微信-自定义菜单',
            1200 => '企业微信-H5唤起',
            1201 => '企业微信-微文档/微盘',
            1205 => '小组件（iOS14 Home Screen Widget）',
            1206 => '剪贴板识别小程序码',
            1207 => '桌面小程序（Android快捷方式）',
            1208 => '扫一扫-相册（新版聚合）',
            1209 => '我的页面-最近使用',
            1210 => '我的页面-收藏',
            1211 => '视频号-外链小程序',
            1212 => '视频号-服务通知',
            1213 => '视频号-直播Tab',
            1214 => '视频号-我的Tab',
            1216 => '扫一扫-文档拍照识别（新）',
            1217 => '扫一扫-小程序码（聚合）',
            // —— 若你后续碰到新的官方场景值，只要在这里继续补充即可 ——
        ];
    }

}
